AWS SDK for RubyでのAPI操作をインタラクティブに実行する
AWS SDKを使うと、各種プログラミング言語からAWSのリソースを操作することが出来ます。
現時点(2015年7月時点)でサポートされいる言語/プラットフォームとしてはJava、.NET、Node.js、PHP、Python、Ruby、Go、Javascript(in Browser)、Android、iOS、Unityがありますが、この中では私はAWS SDK for Rubyを使用する機会が多いです。(個人的な趣味趣向です。)
Rubyなので(というかスクリプト言語なので)、APIのテストをする時もスクリプトを作成してはテスト実行というサイクルを割とカジュアルに回せはするのですが、とは言え、ちょっとこのAPIの戻り値を確認したいな〜という時など、いちいちスクリプトを作成して実行するのが面倒な場合も結構あります。
AWS CLIを使うが如く、AWS SDK for Rubyを使ってもっとカジュアルにAPIを呼び出せればよいのに、、、そんなときに登場するのが、今回ご紹介するaws.rbです。
aws.rbとは
AWS SDK for Rubyに付属のコマンドで、irbまたはPryを使ってAWS SDK for Rubyを対話形式で実行できるツールです。(いわゆるREPLを提供してくれるツールです。)
コマンドライン上で対話形式でAPIにアクセスできるので、ちょっとしたAPIのテスト時などに重宝します。
aws.rbの使い方
前提となる環境
- OS : OS X Yosemite 10.10.4
- Ruby : 2.2.2(rbenvでインストール)
$ ruby -v ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]
インストール
前述のとおり、aws.rb
はAWS SDK for Rubyの付属品ですので、AWS SDK for Rubyをインストールすれば使えるようになります。Pryを使いたい場合は、こちらもインストールしておきます。
$ gem install aws-sdk $ gem install pry
事前準備
クレデンシャル情報を~/.aws/credentials
に設定しておきます。
AWS SDK for Ruby V2 - Configuration
[default] aws_access_key_id = aws_secret_access_key =
起動方法
引数にリージョンを指定して、aws.rb
を実行します。
$ aws.rb --region ap-northeast-1 Aws>
aws.rb
デフォルトではPryを使用します。irbを使いたい場合は引数に--repl irb
を指定してaws.rb
を起動します。
## irbを指定して起動 $ aws.rb --region ap-northeast-1 --repl irb irb(main):001:0> ## pryを明示的に指定して起動 $ aws.rb --region ap-northeast-1 --repl pry Aws>
APIへのアクセス
aws.rb
では、全てのサービスクラスで、各種サービスのクライアントオブジェクトを新規に生成するためのヘルパーメソッドが定義されています。
ヘルパーメソッド名はサービスモジュール名を小文字にしたものとなっています。
サービスモジュール名 | ヘルパーメソッド名 |
---|---|
Aws::S3 | s3 |
Aws::EC2 | ec2 |
Aws::Lambda | lambda |
と言った感じです。
例えば、通常SDKでS3のAPIにアクセスするためには以下のようにS3のクライアントオブジェクトをnewしてやる必要があるわけですが、
s3 = Aws::S3::Client.new(region: 'ap-northeast-1a')
aws.rb
ではいちいちnewしなくてもいきなりこのs3
が使える、というイメージです。
実際にaws.rb
をからS3のバケット一覧を取得してみます。list_buckets
を使います。
Aws>s3.list_buckets [Aws::S3::Client 200 0.736553 0 retries] list_buckets() => # buckets= [#, #, #, #], owner= #>
クライアントオブジェクト生成のステップが無いので、AWS CLIに近い感覚でAWS SDK for Rubyが使えます。
続いてバケットの名前だけを取り出して表示してみます。(結果が見易くなるように、最後に;nil
をつけて、戻り値のオブジェクトが表示されないようにしています。)
Aws>s3.list_buckets[0].each {|bucket| puts bucket.name};nil [Aws::S3::Client 200 0.697434 0 retries] list_buckets() yy.config-bucket yy-redshift-audit-logs yy.lambda-test-source yy.lambda-test-sourceresized) => nil
バケットを新規に作成してみます。
Aws>s3.create_bucket({bucket: "yy-aws.rb-test"}) [Aws::S3::Client 200 1.921468 0 retries] create_bucket(bucket:"yy-aws.rb-test",create_bucket_configuration:{location_constraint:"ap-northeast-1"}) => # Aws>s3.list_buckets[0].each {|bucket| puts bucket.name};nil [Aws::S3::Client 200 0.697434 0 retries] list_buckets() yy.config-bucket yy-aws.rb-test yy-redshift-audit-logs yy.lambda-test-source yy.lambda-test-sourceresized) => nil
EC2のAPIも同様に操作してみます。インスタンスIDの一覧を表示します。
Aws>ec2.describe_instances.reservations.each { |reserv| puts reserv.instances[0].instance_id };nil i-715d8883 i-725c8980 i-2c5c89de => nil
まとめ
AWS SDK for Rubyを使ったAPIコールの引数や戻り値などは、ドキュメントを読んだだけではピンと来ないものがたまにあったりします。そんな時はこのaws.rb
を使ってAPIのテストを実行し、引数の意味や戻り値(オブジェクトの中身)を確認してみるのが良いかと思います。